home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d18 / nrpas13.arc / DES.DEM < prev    next >
Text File  |  1991-05-01  |  3KB  |  104 lines

  1. PROGRAM d7r13 (input,output,dfile);
  2. (* driver for routine DES *)
  3. LABEL 5,10,99;
  4. TYPE
  5.    gl32array = ARRAY [1..32] OF integer;
  6.    gl48array = ARRAY [1..48] OF integer;
  7.    gl56array = ARRAY [1..56] OF integer;
  8.    gl64array = ARRAY [1..64] OF integer;
  9. VAR
  10.    glicd,ipc1 : gl56array;
  11.    i,idirec,idum,j,jdum,k,l : integer;
  12.    m,mm,nciphr,newkey,twopwr : integer;
  13.    icmp,iin,iout,key,ip,ipm : gl64array;
  14.    hin,hkey,hout,hcmp : string[17];
  15.    verdct : string[8];
  16.    txt : string[60];
  17.    txt2 : string[6];
  18.    ipc2,iet : gl48array;
  19.    ipp : gl32array;
  20.    is : ARRAY [1..16,1..4,1..8] OF integer;
  21.    ibin : ARRAY [1..4,1..16] OF integer;
  22.    ksflg,cyflg,desflg : boolean;
  23.    dfile : text;
  24.  
  25. (*$I MODFILE.PAS *)
  26.  
  27. (*$I DESKS.PAS *)
  28.  
  29. (*$I DES.PAS *)
  30.  
  31. FUNCTION hex2int(ch:char) : integer;
  32. (* Coverts character representing hexadecimal number to its integer
  33. value in a machine-independent way. *)
  34. BEGIN
  35.    IF (ch >= '0') AND (ch <= '9') THEN
  36.       hex2int := ord(ch)-ord('0')
  37.    ELSE
  38.       hex2int := ord(ch)-ord('A')+10
  39. END;
  40. FUNCTION int2hex(i:integer) : char;
  41. (* Inverse of hex2int *)
  42. BEGIN
  43.    IF i <= 9 THEN
  44.       int2hex := chr(i+ord('0'))
  45.    ELSE
  46.       int2hex := chr(i-10+ord('A'))
  47. END;
  48.  
  49. BEGIN
  50.    ksflg := true;
  51.    cyflg := true;
  52.    desflg := true;
  53.    glopen(dfile,'destst.dat');
  54.    readln (dfile,txt);
  55.    writeln (txt);
  56. 5:   readln (dfile,txt);
  57.    IF eof(dfile) THEN GOTO 99;
  58.    writeln (txt);
  59.    readln (dfile,nciphr);
  60.    readln (dfile,txt2);
  61.    IF (txt2 = 'encode') THEN idirec := 0;
  62.    IF (txt2 = 'decode') THEN idirec := 1;
  63. 10:   writeln ('key':10,'plaintext':20,
  64.       'expected cipher':21,'actual cipher':15);
  65.    mm := 16;
  66.    IF (nciphr < 16) THEN mm := nciphr;
  67.    nciphr := nciphr-16;
  68.    FOR m := 1 to mm DO BEGIN
  69.       readln(dfile,hkey,hin,hcmp);
  70.       FOR i := 1 to 16 DO BEGIN
  71.          j := i+1;
  72.          idum := hex2int(hin[j]);
  73.          jdum := hex2int(hkey[j]);
  74.          FOR k := 1 to 4 DO BEGIN
  75.             l := 4*i+1-k;
  76.             iin[l] := idum MOD 2;
  77.             idum := idum DIV 2;
  78.             key[l] := jdum MOD 2;
  79.             jdum := jdum DIV 2
  80.          END
  81.       END;
  82.       newkey := 1;
  83.       des(iin,key,newkey,idirec,iout);
  84.       hout := '                 ';
  85.       FOR i := 1 to 16 DO BEGIN
  86.          jdum := 0;
  87.          twopwr := 16;
  88.          FOR j := 1 to 4 DO BEGIN
  89.             twopwr := twopwr DIV 2;
  90.             jdum := jdum+twopwr*iout[4*(i-1)+j]
  91.          END;
  92.          hout[i+1] := int2hex(jdum)
  93.       END;
  94.       verdct := 'wrong   ';
  95.       IF (hcmp = hout) THEN verdct := 'o.k.    ';
  96.       writeln(hkey,hin,hcmp,hout,verdct:10)
  97.    END;
  98.    writeln ('press RETURN to continue ...');
  99.    readln;
  100.    IF (nciphr <= 0) THEN GOTO 5;
  101.    GOTO 10;
  102. 99:
  103. END.
  104.